<?php
/**
 * Basic administrator class
 * 所有可以重载的操作拥有默认_<操作>函数. 例_create为默认，create可以重载
 * CURD 操作:               create  update  read    delete
 * CURD 提交操作:           add     save    N/A     N/A
 * 生成列表一览:            _list
 * 搜索条件做成:            _search
 * @author jiangz2
 *
 */
class CommonAdminAction extends CommonAction {
    protected function setNav($arr){
        $nav = "<a href=\"".__APP__."/Admin\">管理首页</a>";

        for ($i = 0; $i < count($arr); $i++) {
            $row = $arr[$i];
            $nav .= "<span> &gt; </span>";
            $nav .= "<a href=\"".$row[1]."\">".$row[0]."</a>";
        }
        $this->assign("nav", $nav);
    }

    /**
     * 获取当前操作的表名称
     * 默认为当前action
     * 可以在action控制器中重载
     * @access protected
     */
    protected function _getDBName() {
        return $this->getActionName();
    }

    /**
     * 取得操作成功后要返回的URL地址
     * 默认返回当前模块的默认操作
     * 可以在action控制器中重载
     * @access public
     * @return string
     * @throws ThinkExecption
     */
    protected function getReturnUrl() {
        return __URL__ . '?' . C('VAR_MODULE') . '=' . MODULE_NAME . '&' . C('VAR_ACTION') . '=' . C('DEFAULT_ACTION');
    }

    /**
     * 根据表单生成查询条件
     * 进行列表过滤
     * @access protected
     * @param string $name 数据对象名称
     * @return HashMap
     * @throws ThinkExecption
     */
    protected function _search($name = '') {
        //生成查询条件
        if (empty($name)) {
            $name = $this->_getDBName();
        }
        $name = $this->_getDBName();
        $model = D($name);
        $map = array();
        foreach ($model->getDbFields() as $key => $val) {
            if (isset($_REQUEST [$val]) && $_REQUEST [$val] != '') {
                $map [$val] = $_REQUEST [$val];
            }
        }
        return $map;
    }

    /**
     * 根据表单生成查询条件
     * 进行列表过滤
     * @access protected
     * @param Model $model 数据对象
     * @param HashMap $map 过滤条件
     * @param string $sortBy 排序
     * @param boolean $asc 是否正序
     * @return array
     * @throws ThinkExecption
     +----------------------------------------------------------
     */
    protected function _list($model, $map, $sortBy = '', $asc = false) {
        $result = array();
        
        //是否分页
        if (isset($_REQUEST ['_page']) && $_REQUEST ['_page']) {
            $isPage = true;
        } else {
            $isPage = false;
        }
        //排序字段 默认为主键名
        if (isset($_REQUEST ['_order'])) {
            $order = $_REQUEST ['_order'];
        } else {
            $order = !empty($sortBy) ? $sortBy : $model->getPk();
        }
        //排序方式默认按照倒序排列
        //接受 sost参数 0 表示倒序 非0都 表示正序
        if (isset($_REQUEST ['_sort'])) {
            $sort = $_REQUEST ['_sort'] ? 'asc' : 'desc';
        } else {
            $sort = $asc ? 'asc' : 'desc';
        }
        //取得满足条件的记录数
        $count = $model->where($map)->count($model->getPk());
        if ($count > 0) {
            if ($isPage) {
                import("ORG.Util.Page");
                //创建分页对象
                if (!empty($_REQUEST ['listRows'])) {
                    $listRows = $_REQUEST ['listRows'];
                } else {
                    $listRows = '';
                }
                $p = new Page($count, $listRows);
                //分页查询数据

                $voList = $model->where($map)->order("`" . $order . "` " . $sort)->limit($p->firstRow . ',' . $p->listRows)->select();
                Log::write('sql:' . $model->getLastSql(), Log::SQL);
                //分页跳转的时候保证查询条件
                foreach ($map as $key => $val) {
                    if (!is_array($val)) {
                        $p->parameter .= "$key=" . urlencode($val) . "&";
                    }
                }
                //分页显示
                $page = $p->show();
                //列表排序显示
                $sortImg = $sort; //排序图标
                $sortAlt = $sort == 'desc' ? '升序排列' : '倒序排列'; //排序提示
                $sort = $sort == 'desc' ? 1 : 0; //排序方式
                
                $result['list'] = $voList;
                $result['page'] = $page;
            } else {
                $voList = $model->where($map)->order("`" . $order . "` " . $sort)->select();
                Log::write('sql:' . $model->getLastSql(), Log::SQL);                
                $result['list'] = $voList;
            }
            
            //列表排序显示
            $sortImg = $sort; //排序图标
            $sortAlt = $sort == 'desc' ? '升序排列' : '倒序排列'; //排序提示
            $sort = $sort == 'desc' ? 1 : 0; //排序方式
            
            //模板赋值显示
            $result['sort'] = $sort;
            $result['order'] = $order;
            $result['sortImg'] = $sortImg;
            $result['sortType'] = $sortAlt;
        }
        return $result;
    }

    /**
     * 默认操作
     * 显示列表
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    public function index() {
        $r = $this->_readlist();
        if ($this->isAjax()) {
            $this->ajaxReturn30($r);
        } else {
            $this->assign($r);
            $this->display();
        }
        return;
    }
    
    /**
     * 显示列表，返回结果列表
     * @access public
     * @return array
     * @throws ThinkExecption
     * @see _list
     */
    protected function _readlist() {
        //列表过滤器，生成查询Map对象
        $map = $this->_search();
        if (method_exists($this, '_filter')) {
            $this->_filter($map);
        }
        $name = $this->_getDBName();
        $model = D($name);
        if (!empty($model)) {
            $r = $this->_list($model, $map);
            cookie('_currentUrl_', __SELF__);
            return $r;
        }
    }
    
    /**
     * 新增操作
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    public function create() {
        $this->display();
    }

    /**
     * 新增提交操作
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    function add() {
        $name = $this->_getDBName();
        $model = D($name);
        $vo = $model->create();
        if (false === $vo) {
            $this->error($model->getError());
        }
        //保存当前数据对象
        $list = $model->add();
        Log::write('sql:' . $model->getLastSql(), Log::SQL);
        if ($list !== false) { //保存成功
            $iPk = $model->getLastInsID();
            if($iPk) {
                // 自增主键返回插入ID
                $vo[$model->getPk()] = $iPk;
            }
            $this->success('新增成功!',cookie('_currentUrl_'), $this->isAjax() ? $vo : false);
        } else {
            //失败提示
            $this->error('新增失败!');
        }
    }
    
    /**
     * 更新操作
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    function update() {
        $vo = $this->_update();
        if (!$vo) {
            $this->error("未找到更改的目标");
        }
        
        $this->assign('vo', $vo);
        $this->display();
    }
    
    /**
     * 更新: 根据主键取得项目
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    protected function _update() {
        $name = $this->_getDBName();
        $model = M($name);
        $id = $_REQUEST [$model->getPk()];
        return $model->where(array($model->getPk()=>$id))->find();
    }
    
    /**
     * 读取操作
     * 默认使用与更新相同的逻辑
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    function read() {
        $vo = $this->_update();
        if (!$vo) {
            $this->error("未找到需要读取的目标");
        }
        
        $this->assign('vo', $vo);
        $this->display();
    }
    
    /**
     * 更新提交操作
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    function save() {
        $name = $this->_getDBName();
        $model = D($name);
        $vo = $model->create();
        if (false === $vo) {
            $this->error($model->getError());
        }
        // 更新数据
        $list = $model->save();
        Log::write('sql:' . $model->getLastSql(), Log::SQL);
        if (false !== $list) {
            //成功提示
            $this->success('编辑成功!',cookie('_currentUrl_'), $this->isAjax() ? $vo : false);
        } else {
            //错误提示
            $this->error('编辑失败!');
        }
    }

    /**
     * 默认删除操作
     * @access public
     * @return void
     * @throws ThinkExecption
     */
    public function delete() {
        //删除指定记录
        $name = $this->_getDBName();
        $model = D($name);
        if (!empty($model)) {
            $pk = $model->getPk();
            $id = $_REQUEST [$pk];
            if (isset($id)) {
                $condition = array($pk => array('in', explode(',', $id)));
                $list = $model->where($condition)->delete();
                Log::write('sql:' . $model->getLastSql(), Log::SQL);
                if (false !== $list) {
                    $this->success('删除成功!', cookie('_currentUrl_'));
                } else {
                    $this->error('删除失败!');
                }
            } else {
                $this->error('非法操作');
            }
        }
    }
}
?>
